package errs

import "fmt"

// 错误类型
type Type int32

const pkg string = "gitee.com/hailib/mytree"

const (
	NotImplement     Type = iota + 1 // 未实现
	UnexceptError                    // 意料之外的错误
	InvalidParam                     // 无效的参数
	TooManyChildren                  // 太多子分支
	DatabaseError                    // 数据库出错
	TransactionError                 // 事务出错
	DbQueryError                     // 数据库查询出错
	DbUpdateError                    // 数据库更新出错
)

// Error MyTree 错误
type Error interface {
	// Error 错误的描述
	Error() string
	// Kind 错误的类型
	Type() Type
	// Code 错误的编码
	Code() int64
	// Package 错误所属的包
	Package() string
}

// New 初始化新的错误
func New(kind Type, code int64, desc string, args ...interface{}) Error {
	msg := fmt.Sprintf(desc, args...)

	return &myerror{
		kind: kind,
		code: code,
		msg:  msg,
	}
}

type myerror struct {
	kind Type
	code int64
	msg  string
}

func (m *myerror) Error() string {
	return fmt.Sprintf("MyTree(%d): %s", m.kind, m.msg)
}

func (m *myerror) Type() Type {
	return m.kind
}

func (m *myerror) Code() int64 {
	return m.code
}

func (m *myerror) Package() string {
	return pkg
}
